<?php defined('SYSPATH') OR die('No direct access allowed.');

abstract class Core_Sintatico_bkp implements Constants {

	const D = "[0-9]";
	const L = "[A-Za-z]";
	const A = "[A-Za-z0-9]";
	const OP = "\+|\-|\*|/";
	const Q = ".";
	const ASS= "'";
	const ASD = "\"";
	const C = "[(!)(=)(>)(<)]";
	const EB = "[\ \	\
    	\r]";
	
	
    /**
     * Analizador lexico
     * @var Object
     */
	protected $tokens = array('(',')',',','.','IDENTIFICADOR','STRING','COMPARACAO','SELECAO','PROJECAO','CARTESIANO','JUNCAO','UNIAO');
	/**
	 * Tabela de analize sintatica.
	 * @var Matriz[NT][T] T-Terminal NT-NãoTerminal
	 */
	protected $tabela = array(//	TERMIAIS    	$,(,),.,,,IDENTIFICADOR,STRING,COMPARACAO,SELECAO,PROJECAO,CARTESIANO,JUNCAO,UNIAO
							'<COMANDO>'		=>array('$'=>'',	'('=>'',	')'=>'',	'.'=>'',	','=>'',	'IDENTIFICADOR'=>'3',	'STRING'=>'',	'COMPARACAO'=>'',	'SELECAO'=>'0',	'PROJECAO'=>'1',	'CARTESIANO'=>'2',	'JUNCAO'=>'',	'UNIAO'=>''),
							'<SELECAO>'		=>array('$'=>'',	'('=>'',	')'=>'',	'.'=>'',	','=>'',	'IDENTIFICADOR'=>'',	'STRING'=>'',	'COMPARACAO'=>'',	'SELECAO'=>'4',	'PROJECAO'=>'',		'CARTESIANO'=>'',	'JUNCAO'=>'',	'UNIAO'=>''),
							'<PROJECAO>'	=>array('$'=>'',	'('=>'',	')'=>'',	'.'=>'',	','=>'',	'IDENTIFICADOR'=>'',	'STRING'=>'',	'COMPARACAO'=>'',	'SELECAO'=>'',	'PROJECAO'=>'5',	'CARTESIANO'=>'',	'JUNCAO'=>'',	'UNIAO'=>''),
							'<CARTESIANO>'	=>array('$'=>'',	'('=>'',	')'=>'',	'.'=>'',	','=>'',	'IDENTIFICADOR'=>'',	'STRING'=>'',	'COMPARACAO'=>'',	'SELECAO'=>'',	'PROJECAO'=>'',		'CARTESIANO'=>'6',	'JUNCAO'=>'',	'UNIAO'=>''),
							'<CONJUNTO>'	=>array('$'=>'',	'('=>'',	')'=>'',	'.'=>'',	','=>'',	'IDENTIFICADOR'=>'7',	'STRING'=>'',	'COMPARACAO'=>'',	'SELECAO'=>'',	'PROJECAO'=>'',		'CARTESIANO'=>'',	'JUNCAO'=>'',	'UNIAO'=>''),
							'<CONJUNTO1>'	=>array('$'=>'',	'('=>'',	')'=>'',	'.'=>'',	','=>'',	'IDENTIFICADOR'=>'',	'STRING'=>'',	'COMPARACAO'=>'',	'SELECAO'=>'',	'PROJECAO'=>'',		'CARTESIANO'=>'',	'JUNCAO'=>'8',	'UNIAO'=>'9'),
							'<CAMPOS>'		=>array('$'=>'',	'('=>'',	')'=>'',	'.'=>'',	','=>'',	'IDENTIFICADOR'=>'10',	'STRING'=>'',	'COMPARACAO'=>'',	'SELECAO'=>'',	'PROJECAO'=>'',		'CARTESIANO'=>'',	'JUNCAO'=>'',	'UNIAO'=>''),
							'<CAMPOS1>'		=>array('$'=>'12',	'('=>'',	')'=>'',	'.'=>'',	','=>'11',	'IDENTIFICADOR'=>'',	'STRING'=>'',	'COMPARACAO'=>'',	'SELECAO'=>'',	'PROJECAO'=>'',		'CARTESIANO'=>'',	'JUNCAO'=>'',	'UNIAO'=>''),
							'<CRITERIO>'	=>array('$'=>'',	'('=>'',	')'=>'',	'.'=>'',	','=>'',	'IDENTIFICADOR'=>'13',	'STRING'=>'',	'COMPARACAO'=>'',	'SELECAO'=>'',	'PROJECAO'=>'',		'CARTESIANO'=>'',	'JUNCAO'=>'',	'UNIAO'=>''),
							'<CRITERIO1>'	=>array('$'=>'',	'('=>'',	')'=>'',	'.'=>'',	','=>'',	'IDENTIFICADOR'=>'14',	'STRING'=>'15',	'COMPARACAO'=>'',	'SELECAO'=>'',	'PROJECAO'=>'',		'CARTESIANO'=>'',	'JUNCAO'=>'',	'UNIAO'=>''),
							'<TABELA>'		=>array('$'=>'',	'('=>'',	')'=>'',	'.'=>'',	','=>'',	'IDENTIFICADOR'=>'16',	'STRING'=>'',	'COMPARACAO'=>'',	'SELECAO'=>'',	'PROJECAO'=>'',		'CARTESIANO'=>'',	'JUNCAO'=>'',	'UNIAO'=>''),
							'<TABELA1>'		=>array('$'=>'18',	'('=>'',	')'=>'18',	'.'=>'17',	','=>'18',	'IDENTIFICADOR'=>'',	'STRING'=>'',	'COMPARACAO'=>'18',	'SELECAO'=>'',	'PROJECAO'=>'',		'CARTESIANO'=>'',	'JUNCAO'=>'18',	'UNIAO'=>'18'),
							'<ELEMENTO_I>'	=>array('$'=>'',	'('=>'',	')'=>'',	'.'=>'',	','=>'',	'IDENTIFICADOR'=>'19',	'STRING'=>'',	'COMPARACAO'=>'',	'SELECAO'=>'',	'PROJECAO'=>'',		'CARTESIANO'=>'',	'JUNCAO'=>'',	'UNIAO'=>''),
							'<ELEMENTO_S>'	=>array('$'=>'',	'('=>'',	')'=>'',	'.'=>'',	','=>'',	'IDENTIFICADOR'=>'',	'STRING'=>'20',	'COMPARACAO'=>'',	'SELECAO'=>'',	'PROJECAO'=>'',		'CARTESIANO'=>'',	'JUNCAO'=>'',	'UNIAO'=>'')
	);
	/**
	 * Vetor contendo as regras de produção da nossa linguagem
	 * @var Matriz[R][R] R-Regras de produção
	 */
	protected $regras = array(
							'0'		=>array('<SELECAO>'),//COMANDO
							'1'		=>array('<PROJECAO>'),//COMANDO
							'2'		=>array('<CARTESIANO>'),//COMANDO
							'3'		=>array('<CONJUNTO>'),//COMANDO
							'4'		=>array('SELECAO','(','<TABELA>',')','(','<CRITERIO>',')'),//SELECAO
							'5'		=>array('PROJECAO','(','<TABELA>',')','<CAMPOS>'),//PROJECAO
							'6'		=>array('CARTESIANO','(','<TABELA>',')','(','<CRITERIO>',')'),//CARTESIANO
							'7'		=>array('<TABELA>','<CONJUNTO1>'),//CONJUNTO
							'8'		=>array('JUNCAO','<TABELA>'),//CONJUNTO1
							'9'		=>array('UNIAO','<TABELA>'),//CONJUNTO1
							'10'	=>array('<TABELA>','<CAMPOS1>'),//CAMPOS
							'11'	=>array(',','<CAMPOS1>'),//CAMPOS1
							'12'	=>array('î'),//CAMPOS1
							'13'	=>array('<TABELA>','COMPARACAO','<CRITERIO1>'),//CRITERIO
							'14'	=>array('<TABELA>'),//CRITERIO1
							'15'	=>array('<ELEMENTO_S>'),//CRITERIO1
							'16'	=>array('<ELEMENTO_I>','<TABELA1>'),//TABELA
							'17'	=>array('.','<ELEMENTO_I>'),//TABELA1
							'18'	=>array('î'),//TABELA1
							'19'	=>array('IDENTIFICADOR'),//ELEMENTO_I
							'20'	=>array('STRING'),//ELEMENTO_S
	);	
	/**
	 * Pilha de elementos sintaticos.
	 * @var Vetor[]
	 */
	protected $pilha = array();
	/**
	 * Vetor contendo os simbolos(tokens) de entrada passados pelo analizador lexico.
	 * @var Vetor[tokens]
	 */
	protected $entrada = array();
	/**
	 * Saida gerada pelo analizador sintatico.
	 * @var ???????
	 */
	protected $saida = array();

	protected $arvore = array();
	/**
	 * Posição do simbolo atual
	 * @var int
	 */
	protected $posicao = 0;
	
	public function __construct(){

	}
	
	/**
	 * Informa se ainda simbolos de entrada a ser analizados
	 * @return boolean
	 */
    protected function temEntrada(){
        return $this->posicao < count($this->entrada);
    }
	
    /**
     * Retorna o proximo simbolo de entrada
     * @return Char
     */
    protected function nextToken(){
        if ($this->temEntrada()){
        	$token = $this->entrada[$this->posicao++];
        	if(is_object($token)){
        		return $token->getId();
        	}else{
        		return $token;
        	}
        }else{
            return '-1';
        }
    }
    
    protected function retiraPilha(){
    	$elemento_retirado = array_pop($this->pilha);
    }
    protected function colocaPilha($producoes){
   		$producoes = array_reverse($producoes);
   		foreach ($producoes as $producao) {
   			if($producao!='î'){
   				$this->pilha[] = $producao;
   			}
   			
   		}
    }
    protected function getTopoPilha(){
    	return $this->pilha[count($this->pilha)-1];
    }
    
	protected function isEREG($er, $c){
    	$r = ereg($er, $c);
    	if($r==0){
    		return false;
    	}else{
    		return true;
    	}
    }

} // End Core_Sintatico